/********************************************************************************
 * Project Name		[JavaSE_Fundamentals]
 * File Name     	[LoadingOrder.java]
 * Creation Date 	[2015-01-01]
 * 
 * Copyright© ge.y.yang@gmail.com All Rights Reserved
 * 
 * Work hard, play harder, think big and keep fit
 ********************************************************************************/
package objectOriented;

/**
 * Java类内属性, 构造方法, 构造代码块的加载顺序<br/>
 * 
 * Java编译器编译源文件的时候会把成员变量的声明语句提前至一个类的最前端<br/>
 * 成员变量的初始化是在构造方法中执行的<br>
 * 一旦经过Java编译器编译后, 构造代码块中的代码就会移动到构造方法中并且最先执行, 构造方法中的原有的代码是最后执行的<br/>
 * 显示初始化的成员变量与构造代码块是按照声明顺序执行的[交换TestClass2属性和构造代码块的顺序可测试]<br/>
 * 
 * @author 不落的太阳(Sean Yang aka ShortPeace)
 * @version 1.0
 * @since jdk 1.8
 * 
 */
public class LoadingOrder {

	public static void main(String[] args) {
		TestClass1 test1 = new TestClass1();
		System.out.println(test1.getI());

		TestClass2 test2 = new TestClass2();
		System.out.println(test2.getI());
	}
}

/**
 * 
 * @author 不落的太阳(Sean Yang aka ShortPeace)
 * @version 1.0
 * @since jdk 1.8
 *
 */
class TestClass1 {

	private int i = 1000;

	{
		i = 2000;
	}

	public TestClass1() {
		i = 3000;
	}

	public int getI() {
		return i;
	}
}

/**
 * 
 * @author 不落的太阳(Sean Yang aka ShortPeace)
 * @version 1.0
 * @since jdk 1.8
 *
 */
class TestClass2 {

	{
		i = 2000;
	}

	private int i = 1000;

	public TestClass2() {
		super();
	}

	public int getI() {
		return i;
	}
}
